调用这三个商业地图服务,我们使用的都是切片(Tile)地图服务,关于切片地图的含义这里做简单的介绍:
切片地图就是指将显示的地图切成一块一块的(256 * 256)分别显示加载。openlayers 3中有这样图层加载类,ol.layer.Tile
,对应的source类有ol.source.TileImage
,ol.source.XYZ
,这两者的关系通过源码可以看到ol.inherits(ol.source.XYZ, ol.source.TileImage);
,ol.source.TileImage
是父类。
对于天地图,我们访问天地图地图主页服务,打开控制台->Network
,我们可以看到请求的一些地址如下:
1 | http://t2.tianditu.com/DataServer?T=vec_w&x=53&y=24&l=6' |
其中重要的信息是x,y,z分别表示x坐标,y坐标和zoomLevel,
其实在openlayers 3源码中有Bing地图和OSM地图的扩展了,我们可以仿照它们进行一些扩展。
1.扩展天地图
源码使用模块化打包
1 | var ol = require('openlayers'); |
使用方法
1 | var tianMapSat = new ol.layer.Tile({ |
2. 扩展百度地图
百度地图坐标进行了加偏,所以需要使用projzh
转化
百度地图使用的是定制化的墨卡托投影和BD-09 datum,所以将WGS-84坐标转化为百度坐标需要两步
first transform from WGS-84 to BD-09 (which itself uses the GCJ-09 transform), and then do the forward transform to Baidu Mercator
第一步是将WGS-84 转化为 BD-09,然后转化为百度墨卡托1
baiduMercator.forward(bd09.fromWGS84(point))
反过来的转化为1
bd09.toWGS84(baiduMercator.inverse(point))
1 | var ol = require('openlayers'); |
调用1
2
3
4
5var baiduMapSat = new ol.layer.Tile({
title: "百度地图卫星",
source: new ol.source.BaiduMap({mapType:"sat"})
});
map.addLayer(baiduMapSat);
3. 扩展高德地图
1 | var ol = require('openlayers'); |
调用1
2
3
4
5var aMapSat = new ol.layer.Tile({
title: "高德地图卫星",
source: new ol.source.AMap({mapType:"sat"})
});
map.addLayer(aMapSat);
最后推荐一个github仓库,Openlayers 3 使用React 组件化+wepack+ES6实践,
包括扩展在其中的具体使用方法